(function () {

	//	获取viewer对象
	const viewer = solarSystem.baseViewer;

	//	C# Wasm模块的Sgp4Lib类
	const Sgp4Lib = Cesium.AstroxWasm.exports.Sgp4Lib;

	//获取平台管理对象
	//var yyastk = window.getYYASTK();
	//获取当前场景管理对象
	//var currentScenario = yyastk.CurrentScenario;

	const cartScratch = new Cesium.Cartesian3();


	/**
	 * 单个卫星文件的点的更新
	 * @param {string} name 
	 * @param {Cesium.PointPrimitiveCollection} pointCollection 
	 * @returns 
	 */
	const animatePoints = function (name, pointCollection) {
		return function(scene, jd) {
			//  计算指定name的tle的位置速度
			const rv = Sgp4Lib.GetTlePosByName(jd.dayNumber, jd.secondsOfDay, name);
			
			if (!rv || rv.length === 0) {
				return undefined;
			}

			var points = pointCollection._pointPrimitives;
			for (var i = 0; i < points.length; i++) {
				cartScratch.x = rv[3 * i];
				cartScratch.y = rv[3 * i + 1];
				cartScratch.z = rv[3 * i + 2];

				//	这里赋值会copy
				points[i].position = cartScratch;
			}
		};
	};

	/**
	 * 将TLE历元时间字符串转换为ISO 8601格式
	 * @param {string} epochStr - TLE历元时间，例如 "25270.02712698"
	 * @returns {string} ISO 8601格式的时间字符串，例如 "2025-09-27T00:39:03.336Z"
	 */
	const convertEpochToISO = function(epochStr) {
		try {
			// 解析年份（2位）和天数（带小数）
			const year = parseInt(epochStr.substring(0, 2));
			const dayOfYear = parseFloat(epochStr.substring(2));
			
			// 转换为4位年份（只考虑2000年之后）
			const fullYear = 2000 + year;
			
			// 创建该年1月1日的日期
			const date = new Date(Date.UTC(fullYear, 0, 1));
			
			// 计算总毫秒数（天数-1，因为1月1日是第1天）
			const milliseconds = (dayOfYear - 1) * 24 * 60 * 60 * 1000;
			
			// 添加毫秒数
			date.setTime(date.getTime() + milliseconds);
			
			// 返回ISO格式
			return date.toISOString();
		} catch (error) {
			console.error('转换历元时间失败:', error);
			return 'N/A';
		}
	}

	/**
	 * 从TLE字符串中获取历元时间
	 * @param {string} tleStr - TLE字符串
	 * @returns {string} ISO 8601格式的时间字符串
	 */
	const getEpochTimeFromTle = function(tleStr) {
		const lines = tleStr.split('\n')
			.map(line => line.trim())  // 移除每行前后空格
			.filter(line => line.length > 0);  // 移除空行
		
		// 查找第一个有效的TLE
		for (let i = 0; i < lines.length; i++) {
			// 3行格式: 名称 + 行1 + 行2
			if (i + 2 < lines.length && 
				lines[i].length > 0 && 
				lines[i + 1].startsWith("1 ") && 
				lines[i + 2].startsWith("2 ")) {
				
				const line1 = lines[i + 1];
				// 历元时间在第一行的第18-32位（年份+天数）
				const epochStr = line1.substring(18, 32).trim();
				return convertEpochToISO(epochStr);
			}
			// 2行格式: 行1 + 行2
			else if (i + 1 < lines.length && 
					 lines[i].startsWith("1 ") && 
					 lines[i + 1].startsWith("2 ")) {
				
				const line1 = lines[i];
				// 历元时间在第一行的第18-32位（年份+天数）
				const epochStr = line1.substring(18, 32).trim();
				return convertEpochToISO(epochStr);
			}
		}
		
		return 'N/A';
	}

	// 存储加载的卫星文件数据
	var satelliteFiles = [];

	var Demo = {
		//插件唯一编号,需要和json里的id保持一致
		id: "Plugins_MultiSgp4",
		menu: {
			//点击菜单后触发的事件
			click: function (element) {

			solarSystem.openWindow($('#plugins_MultiSgp4_container'), {
				//skin: "debris-layui",
				key: "plugins_MultiSgp4_Dialog",
				title: "加载多个TLE文件",
				width: 700,
				height: 350,
				top: ($(window).height() - 350 - 100) + 'px',  // 窗口高度 - 对话框高度 - 底部边距30px
				left: ($(window).width() - 700 - 30) + 'px',  // 窗口宽度 - 对话框宽度 - 右侧边距30px
				success: function (layero, index) {						
				},
				end: function () {
					//关闭窗口时删除所有添加的对象
					Demo.clear();
				}
			});

				//solarSystem.clock.currentTime = new Date().getTime();			
				
			}
		},

		//从本地加载两行根数的文件, 并给wasm里Sgp4赋值所有TLE
		loadFile: function () {
			// 创建一个文件选择对话框
			const fileInput = document.createElement("input");
			fileInput.type = "file";
			fileInput.accept = "*"; // 接受所有类型的文件
			fileInput.style.display = "none"; // 隐藏文件选择框
			document.body.appendChild(fileInput);

			// 监听文件选择事件
			fileInput.addEventListener("change", () => {
				const file = fileInput.files[0];
				if (file) {
					// 读取文件内容
					const reader = new FileReader();
					reader.onload = () => {
						// 文件内容
						const fileContent = reader.result;
						let tleStr = fileContent;

						// 检查是否为JSON文件
						if (file.name.toLowerCase().endsWith('.json')) {
							try {
								const jsonData = JSON.parse(fileContent);
								
								// 检查是否有DebrisTLEs属性
								if (jsonData.DebrisTLEs && Array.isArray(jsonData.DebrisTLEs)) {
									// 提取TLE数据并格式化为标准TLE字符串
									const tleLines = [];
									jsonData.DebrisTLEs.forEach(debris => {
										if (debris.SAT_Name && debris.TLE_Line1 && debris.TLE_Line2) {
											// 添加卫星名称作为第一行
											tleLines.push(debris.SAT_Name);
											// 添加TLE行1和行2
											tleLines.push(debris.TLE_Line1);
											tleLines.push(debris.TLE_Line2);
										}
									});
									
									// 将提取的TLE数据合并为字符串
									tleStr = tleLines.join('\n');
									console.log(`从JSON文件中提取了 ${jsonData.DebrisTLEs.length} 个TLE数据`);
								} else {
									console.warn('JSON文件中未找到DebrisTLEs属性或格式不正确');
									// 如果JSON格式不正确，仍然尝试使用原始内容
								}
							} catch (error) {
								console.error('解析JSON文件失败:', error);
								// 如果JSON解析失败，使用原始内容
							}
						}

						// 将文件信息添加到表格中（暂不添加到场景）
						Demo.addFileToTable(file.name, tleStr);
					};
					reader.readAsText(file);
				}
				// 移除文件选择框
				document.body.removeChild(fileInput);
			});

			// 触发文件选择对话框
			fileInput.click();
		},

		// 添加文件到表格中，并更新表格显示
		addFileToTable: function(fileName, tleStr) {
			const fileId = Date.now(); // 使用时间戳作为唯一ID
			const satelliteData = {
				id: fileId,
				name: fileName,
				tleStr: tleStr,
				epochTime: getEpochTimeFromTle(tleStr),
				pointSize: 3,  // 默认点大小
				pointColor: '#ffffff',  // 默认白色
				addedToScene: false,  // 默认不添加到场景
				pointCollection: null,  // PointPrimitiveCollection对象
				preRenderListener: null,  // 渲染监听器
				satelliteCount: 0  // 卫星数量
			};

			satelliteFiles.push(satelliteData);
			Demo.updateTable();
		},

		// 更新表格显示
		updateTable: function() {
			const tbody = document.getElementById('satelliteTableBody');
			tbody.innerHTML = '';

			satelliteFiles.forEach((file, index) => {
				const row = document.createElement('tr');
				row.innerHTML = `
					<td style="padding: 8px; background-color: #2a2a2a; color: #ffffff;">${file.name}</td>
					<td style="padding: 8px; background-color: #2a2a2a; color: #ffffff; cursor: pointer;" 
						title="双击设置场景时间"
						ondblclick="Plugins.values['Plugins_MultiSgp4'].setSceneTime('${file.epochTime}')">
						${file.epochTime}
					</td>
					<td style="padding: 8px; background-color: #2a2a2a;">
						<input type="number" value="${file.pointSize}" min="1" max="20" 
							   style="background-color: #3a3a3a; color: #ffffff; border: 1px solid #555;"
							   onchange="Plugins.values['Plugins_MultiSgp4'].updateFileProperty(${index}, 'pointSize', this.value)" />
					</td>
					<td style="padding: 8px; background-color: #2a2a2a;">
						<input type="color" value="${file.pointColor}" 
							   style="background-color: #3a3a3a; border: 1px solid #555;"
							   onchange="Plugins.values['Plugins_MultiSgp4'].updateFileProperty(${index}, 'pointColor', this.value)" />
					</td>
					<td style="padding: 8px; background-color: #2a2a2a;">
						<input type="checkbox" ${file.addedToScene ? 'checked' : ''} 
							   onchange="Plugins.values['Plugins_MultiSgp4'].toggleAddToScene(${index}, this.checked)" />
					</td>
					<td style="padding: 8px; background-color: #2a2a2a;">
						<button onclick="Plugins.values['Plugins_MultiSgp4'].removeFile(${index})" 
								class="delete-btn">
							删除
						</button>
					</td>
				`;
				tbody.appendChild(row);
			});
		},

		// 设置场景时间为指定的历元时间
		setSceneTime: function(epochTimeStr) {
			try {
				if (epochTimeStr === 'N/A') {
					throw new Error('无效的历元时间');
					return;
				}
				
				// 将ISO 8601格式转换为JulianDate
				const jd = Cesium.JulianDate.fromIso8601(epochTimeStr);
				
				// 设置场景当前时间
				solarSystem.clock.currentTime = jd;
				
				console.log(`场景时间已设置为: ${epochTimeStr}`);
			} catch (error) {
				console.error('设置场景时间失败:', error);
			}
		},

		// 更新文件属性
		updateFileProperty: function(index, property, value) {
			if (satelliteFiles[index]) {
				satelliteFiles[index][property] = value;
				
				// 如果修改了点大小或颜色，且已添加到场景，则更新场景中的点
				if ((property === 'pointSize' || property === 'pointColor') && satelliteFiles[index].addedToScene) {
					Demo.updateScenePoints(index);
				}
			}
		},

		// 切换是否添加到场景
		toggleAddToScene: function(index, checked) {
			const file = satelliteFiles[index];
			if (!file) return;

			if (checked) {
				// 添加到场景
				Demo.addFileToScene(index);
			} else {
				// 从场景移除
				Demo.removeFileFromScene(index);
			}
		},

		// 添加文件到场景
		addFileToScene: function(index) {
			const file = satelliteFiles[index];
			if (!file || file.addedToScene) return;

			// 使用文件名作为标识，设置TLE到Sgp4Lib
			Sgp4Lib.SetTLEs(file.name, file.tleStr);
			
			// 获取卫星数量
			const count = Sgp4Lib.GetCount(file.name);
			file.satelliteCount = count;
			
			console.log(`文件 "${file.name}" 加载的卫星数目：${count}`);

			// 创建PointPrimitiveCollection
			file.pointCollection = new Cesium.PointPrimitiveCollection();
			viewer.scene.primitives.add(file.pointCollection);

			const pColor = Cesium.Color.fromCssColorString(file.pointColor);

			// 创建对应数目的点
			for (let i = 0; i < count; i++) {
				file.pointCollection.add({
					position: Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883),
					color: pColor,
					pixelSize: parseInt(file.pointSize),
				});
			}

			// 添加渲染监听器
			file.preRenderListener = viewer.scene.preRender.addEventListener(
				animatePoints(file.name, file.pointCollection)
			);

			file.addedToScene = true;
			console.log(`文件 "${file.name}" 已添加到场景`);
		},

		// 从场景移除文件
		removeFileFromScene: function(index) {
			const file = satelliteFiles[index];
			if (!file || !file.addedToScene) return;

			// 移除渲染监听器
			if (file.preRenderListener) {
				viewer.scene.preRender.removeEventListener(file.preRenderListener);
				file.preRenderListener = null;
			}

			// 移除PointPrimitiveCollection
			if (file.pointCollection) {
				viewer.scene.primitives.remove(file.pointCollection);
				file.pointCollection = null;
			}

			file.addedToScene = false;
			console.log(`文件 "${file.name}" 已从场景移除`);
		},

		// 更新场景中的点（当点大小或颜色改变时）
		updateScenePoints: function(index) {
			const file = satelliteFiles[index];
			if (!file || !file.addedToScene || !file.pointCollection) return;

			const pColor = Cesium.Color.fromCssColorString(file.pointColor);
			const pointSize = parseInt(file.pointSize);

			const points = file.pointCollection._pointPrimitives;
			for (let i = 0; i < points.length; i++) {
				points[i].color = pColor;
				points[i].pixelSize = pointSize;
			}

			console.log(`文件 "${file.name}" 的显示属性已更新`);
		},

		// 删除文件
		removeFile: function(index) {
			if (satelliteFiles[index]) {
				// 如果已添加到场景，先从场景移除
				if (satelliteFiles[index].addedToScene) {
					Demo.removeFileFromScene(index);
				}
				
				satelliteFiles.splice(index, 1);
				Demo.updateTable();
			}
		},

		//移除所有的pointPrimitiveCollection
		clear: function () {
			satelliteFiles.forEach((file, index) => {
				if (file.addedToScene) {
					Demo.removeFileFromScene(index);
				}
			});
		}
	};
	//    Cesium.knockout.track(Demo);
	//把插件对象添加到插件管理器
	Plugins.add(Demo);
})();
